#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Main入口：程序入口文件

主要功能：
1. 解析命令行参数
2. 配置日志
3. 创建解析管理器
4. 运行解析流程
"""

import os
import sys
import time
import argparse
import logging

# 添加项目根目录到Python搜索路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

# 导入配置
from config.config import config
# 导入其他模块
from parser.refactor.manager import ParserManager
from graph.graph_connection import NebulaGraphConnection

def parse_args():
    """解析命令行参数"""
    parser = argparse.ArgumentParser(description='解析代码仓库并生成知识图谱')
    parser.add_argument('--repo-path', type=str, required=True, help='代码仓库路径')
    parser.add_argument('--language', type=str, default='java', help='编程语言（目前支持java）')
    parser.add_argument('--log-level', type=str, choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
                      default='DEBUG', help='日志级别')
    return parser.parse_args()

def setup_logging(log_level: str) -> logging.Logger:
    """配置日志"""
    numeric_level = getattr(logging, log_level, logging.INFO)

    # 创建logs目录（如果不存在）
    log_dir = "logs"
    os.makedirs(log_dir, exist_ok=True)

    # 生成日志文件名（使用当前时间）
    log_filename = os.path.join(log_dir, f"projectx_{time.strftime('%Y%m%d_%H%M%S')}.log")

    # 配置根logger
    logging.basicConfig(
        level=numeric_level,
        format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',
        handlers=[
            logging.StreamHandler(),  # 控制台处理器
            logging.FileHandler(log_filename, encoding='utf-8')  # 文件处理器
        ],
        force=True  # 强制重新配置
    )

    # 设置模块日志级别
    logging.getLogger('parser').setLevel(numeric_level)
    logging.getLogger('graph').setLevel(numeric_level)

    logger = logging.getLogger(__name__)
    logger.debug(f"日志级别设置为: {log_level}")
    logger.info(f"日志文件路径: {os.path.abspath(log_filename)}")
    return logger

def connect_to_nebula():
    """
    连接到NebulaGraph数据库，使用config.py中的配置

    Returns:
        NebulaGraph连接对象
    """
    # 从配置获取NebulaGraph连接信息
    nebula_config = config.get_nebula_config()

    # 创建NebulaGraph连接
    nebula_conn = NebulaGraphConnection(nebula_config)
    if not nebula_conn.connect():
        raise ConnectionError("无法连接到NebulaGraph数据库")
    return nebula_conn

def main():
    """主函数"""
    # 解析命令行参数
    args = parse_args()

    # 设置日志级别
    logger = setup_logging(args.log_level)

    # 检查仓库路径是否存在
    if not os.path.exists(args.repo_path):
        logger.error(f"仓库路径不存在: {args.repo_path}")
        return 1

    try:
        # 连接到NebulaGraph数据库
        logger.info("正在连接到NebulaGraph数据库...")
        graph_conn = connect_to_nebula()
        logger.info("成功连接到NebulaGraph数据库")

        # 创建解析管理器
        logger.info("正在创建解析管理器...")
        parser_manager = ParserManager(args.repo_path, graph_conn, args.language)

        # 运行解析流程
        logger.info("开始解析代码...")
        result = parser_manager.run()

        logger.info(f"处理完成! 成功处理 {result.success_count} 个类，失败 {result.fail_count} 个类")

        # 如果有错误，记录错误信息
        if result.error_messages:
            logger.warning(f"解析过程中发生了 {len(result.error_messages)} 个错误:")
            for i, error in enumerate(result.error_messages[:10], 1):
                logger.warning(f"  {i}. {error}")
            if len(result.error_messages) > 10:
                logger.warning(f"  ... 还有 {len(result.error_messages) - 10} 个错误未显示")

        # 关闭连接
        graph_conn.close()
        logger.info("已关闭NebulaGraph连接")

        return 0
    except Exception as e:
        logger.error(f"处理过程中发生错误: {str(e)}")
        return 1

if __name__ == "__main__":
    sys.exit(main())